# 导入必要的模块
import os  # 操作系统相关功能
import json  # JSON数据处理
import logging  # 日志记录
from logging.handlers import RotatingFileHandler  # 日志文件轮转处理器
from pathlib import Path  # 面向对象的文件路径操作
from typing import Dict, Any  # 类型注解
from fastapi import FastAPI, HTTPException, Request  # FastAPI框架相关
from fastapi.staticfiles import StaticFiles  # 静态文件服务
from fastapi.responses import HTMLResponse  # HTML响应

# 创建FastAPI应用实例
app = FastAPI()

# 确保日志目录存在，如果不存在则创建
os.makedirs("logs", exist_ok=True)

# 配置日志记录器
def setup_logger():
    # 创建名为"api_logger"的日志记录器
    logger = logging.getLogger("api_logger")
    logger.setLevel(logging.DEBUG)  # 设置日志级别为DEBUG（记录所有级别日志）
    
    # 创建控制台处理器（输出到终端）
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)  # 控制台只显示INFO及以上级别日志
    
    # 创建文件处理器（带轮转功能）
    file_handler = RotatingFileHandler(
        "logs/app.log", maxBytes=10_000_000, backupCount=5  # 最大10MB，保留5个备份
    )
    file_handler.setLevel(logging.DEBUG)  # 文件记录DEBUG及以上级别日志
    
    # 创建日志格式
    formatter = logging.Formatter(
        "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    )
    
    # 为两个处理器设置格式
    console_handler.setFormatter(formatter)
    file_handler.setFormatter(formatter)
    
    # 将处理器添加到日志记录器
    logger.addHandler(console_handler)
    logger.addHandler(file_handler)
    
    return logger

# 初始化日志记录器
logger = setup_logger()

# 添加请求日志中间件
@app.middleware("http")
async def log_requests(request: Request, call_next):
    # 记录请求信息
    logger.info(f"请求路径: {request.url.path} - 方法: {request.method}")
    
    # 处理请求
    response = await call_next(request)
    
    # 记录响应状态码
    logger.info(f"响应状态码: {response.status_code}")
    
    return response

# 根路径处理，返回HTML页面
@app.get("/", response_class=HTMLResponse)
async def read_root():
    # 指定HTML文件路径
    html_path = Path("templates/question_bank.html")
    
    try:
        # 解析绝对路径
        abs_path = html_path.resolve()
        
        # 检查文件是否存在
        if not html_path.exists():
            raise FileNotFoundError
            
        # 读取并返回HTML文件内容
        return html_path.read_text(encoding="utf-8")
    
    # 处理文件未找到异常
    except FileNotFoundError:
        logger.error(f"文件未找到：{html_path}")
        raise HTTPException(status_code=404, detail="HTML 文件不存在")
    
    # 处理其他异常
    except Exception as e:
        logger.error(f"读取文件时出错：{e}")
        raise HTTPException(status_code=500, detail="服务器内部错误")

# 获取JSON文件接口
@app.get("/static/{file_name:path}")
async def get_json_file(file_name: str) -> Dict[str, Any]:
    # 确保文件扩展名为.json
    if not file_name.endswith('.json'):
        file_name += '.json'
    
    # 指定静态文件目录
    static_dir = Path("static")
    file_path = static_dir / file_name  # 构建完整文件路径
    
    try:
        # 检查文件是否存在且是普通文件
        if not file_path.exists() or not file_path.is_file():
            raise HTTPException(status_code=404, detail="JSON file not found")
        
        # 打开并读取JSON文件
        with open(file_path, 'r', encoding='utf-8') as f:
            data = json.load(f)  # 解析JSON数据
        
        return data  # 返回解析后的字典数据
    
    # 处理JSON解析错误
    except json.JSONDecodeError:
        raise HTTPException(status_code=400, detail="Invalid JSON file")
    
    # 处理其他异常
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))